package main

import (
	"fmt"
	"github.com/golang/protobuf/proto"
	"net"
	"net/http"
	"net/rpc"
	"rpc_proto/message"
)

/**
rpc和protobuf相结合使用
下载：go get github.com/golang/protobuf
编译.proto文件：protoc --go_out=message message.proto
 */

type ServerOrder struct {}

//注：参一也可以直接定义为message.OrderRequest类型
func (o *ServerOrder)GetOrderInfo(data []byte,orderInfo *message.OrderInfo)error{
	//反序列化
	var orderReq message.OrderRequest
	err := proto.Unmarshal(data,&orderReq)
	if err!=nil{
		panic(err)
	}
	fmt.Printf("sercer端接收到client端信息:订单id:%v 时间戳：%s",orderReq.OrderId,orderReq.TimeStamp)
	//todo..根据id查询数据赋值*orderInfo，client即有数据【rpc内部实现】
	*orderInfo = message.OrderInfo{
		OrderId:1,
		OrderName:"快乐水",
		OrderStatus:1,
	}
	return nil
}

func main(){
	//获取指针对象
	mathUtil := new(ServerOrder)
	//将rpc默认服务上发布一个mathUtil计算服务
	err := rpc.Register(mathUtil)
	if err!=nil{
		panic(err)
	}
	//为rpc message的消息http处理器注册到默认服务器
	rpc.HandleHTTP()

	//开启请求监听
	listen,err := net.Listen("tcp",":8081")
	if err!=nil {
		panic(err)
	}
	fmt.Println("server start success ...")
	//开启服务
	err = http.Serve(listen,nil)
	if err !=nil{
		panic(err)
	}
}
